package chapter_3.demo4;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

/**
 * @author: hero生仔
 *
 * 使用 Predicate<T> 函数式接口
 */
public class Solution {

    public static void main(String[] args) {
        Predicate<String> p = (String s) -> !s.isEmpty();
        List<String> list = new ArrayList<>(Arrays.asList("a","b","c"));
        List<String> result = filter(list, p);
        System.out.println(result);
    }

    /**
     * 第一个 <T> 的作用就是声明这是一个泛型方法，后面的泛型类型参数都是T，如果第一个命名为<R>，后面也
     * 的泛型参数也要定义为<R>这样的意思，要是没有第一个类型参数，那么后面的泛型的类型参数没办法知道，就会出现编译期错误
     */
    public static <T> List<T> filter(List<T> list, Predicate<T> p) {
        List<T> results = new ArrayList<>();
        for (T t : list) {
            if (p.test(t)) {
                results.add(t);
            }
        }
        return results;
    }
}
